#include <stdio.h>
#include <stdlib.h>

typedef int OpType;
typedef union ExprData {
    OpType operand; /* 运算数 */
    char operator; /* 运算符 */
} TElemSet;

typedef struct ExprTreeNode *ExprTree;
struct ExprTreeNode {
    TElemSet data; /* 数据元素 */
    ExprTree left; /* 左孩子指针 */
    ExprTree right; /* 右孩子指针 */
};

ExprTree CreateBinaryTree(TElemSet value, ExprTree left_tree,
                          ExprTree right_tree) {
    ExprTree tree;

    tree = (ExprTree)malloc(sizeof(struct ExprTreeNode));
    tree->data = value;
    tree->left = left_tree;
    tree->right = right_tree;
    return tree;
}

void PrintData(ExprTree tree) {
    if (tree->left == NULL && tree->right == NULL) { /* 叶结点 */
        printf("%d", tree->data); /* 输出运算数 */
    } else { /* 非叶结点 */
        printf("%c", tree->data); /* 输出运算符 */
    }
}

/* 算法5-6：将表达式树转换成中缀表达式 PrintInfixExpression(tree) */
void PrintInfixExpression(ExprTree tree) {
    if (tree->left != NULL) { /* 左子树非空 */
        printf("(");
        PrintInfixExpression(tree->left); /* 中序遍历左子树并生成表达式 */
        printf(")");
    }
    PrintData(
        tree); /* 若结点是叶结点，输出运算数；否则，输出运算符 */
    if (tree->right != NULL) { /* 右子树非空 */
        printf("(");
        PrintInfixExpression(tree->right); /* 中序遍历右子树并生成表达式 */
        printf(")");
    }
}
/* 算法5-6 结束 */

int main(void) {
    ExprTree tree, left_tree, right_tree;
    TElemSet value;

    scanf("%d ", &value);
    left_tree = CreateBinaryTree(value, NULL, NULL);
    scanf("%d ", &value);
    right_tree = CreateBinaryTree(value, NULL, NULL);
    scanf("%c", &value);
    tree = CreateBinaryTree(value, left_tree, right_tree);
    PrintInfixExpression(tree);

    return 0;
}